/**
  泊车员 - 使用某种策略停车
  @author ych
  @param {Array} list 多个停车场数组
  @param {String} methodName 策略名
  @return {Function} 
*/
function parkingAttendant(methodName = 'untilFull', [...list]){
  return methods[methodName]([...list])
}

// 多种策略集合
const methods = {
  untilFull,
  moreSpaceFree,
  lessSpaceFree
};

/**
  有空位就去 停满为止
  @author ych
  @param {Array} list 多个停车场数组
  @return {Number} 目标停车场索引
*/
function untilFull([...list]) {
  const index = list.findIndex((item) => item.includes(null));
  return index;
}

/**
  空位最多
  @author ych
  @param {Array} list 多个停车场数组
  @return {Number} 目标停车场索引
*/
function moreSpaceFree([...list]) {
  const vacantCountList = list.map((listItem) => {
    const vacantList = listItem.filter((item) => item === null);
    return vacantList.length;
  });
  const targetCount = Math.max(...vacantCountList)
  return vacantCountList.indexOf(targetCount);
}

/**
  空位最少
  @author ych
  @param {Array} list 多个停车场数组
  @return {Number} 目标停车场索引
*/
function lessSpaceFree([...list]) {
  const vacantCountList = list.map((listItem) => {
    const vacantList = listItem.filter((item) => item === null);
    // 若空车位为0, 则返回其长度, 不参与计算
    return vacantList.length ? vacantList.length : listItem.length;
  });
  const targetCount = Math.min(...vacantCountList)
  return vacantCountList.indexOf(targetCount);
}